package com.stary.springmvc.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * @description:
 * @author: Mr.Guan
 * @create: 2023-09-29 16:57
 **/
@RequestMapping(value = "/user")
@Controller
public class UserHandler {

    /***
     *  @RequestMapping 可以指定请求方式
     *  解读：
     *    1.buy()方法的url路径： http://ip:port/工程路径/user/bug
     *    2.即                  http://localhost:8080/工程路径/user/bug
     *    3.method = RequestMethod.POST：表示请求buy的目标方法必须是post
     *    4.若没按3要求配置，则报错 Request method '?' not supported  -> ? 代表穿进来的请求方式
     *    5.RequestMethod有4个常用的选项：POST,GET,POST,DELETE[后面会详解]
     *    6.method默认支持GET和POST俩种请求方式
     *    7.return 表示转发到对应页面---WEB-INF/pages/return
     *
     *    补充一点：注意在后端配置中需要加 /，而前端配置中不要加 /
     *    因为后端配置在工程下，是绝对路径。而前端我们填写的是相对路径
     *
     *    补充RequestMapping--method简写方案
     *    @GetMapping @PostMapping @PutMapping @DeleteMapping
     */

    // @RequestMapping(value = "/buy",method = RequestMethod.POST)
    @PostMapping(value = "/buy")
    public String buy(){
        System.out.println("购买商品");
        return "success";
    }


    /***
     *  @RequestMapping 可指定 params 和 headers 支持简单表达式
     *  解读：
     *    基础：
     *    1.params = "bookId"：表示请求目标方法时，必须带一个bookId参数，值没有限定
     *    2.search(String book_id)：表示请求目标方法时，就会将请求携带的参数bookId对应的值，赋给我们的形参book_id
     *    3.如果@RequestMapping注解中设置了params，而请求没有带来一个对应的参数
     *    则报错：Parameter conditions "?" not met for actual request parameters:   ? --> 参数名
     *    4.注意：形参值需要与params对应的值一致
     *
     *    其他方式：
     *    1.params = "bookId = 100"：表示必须给一个bookId的参数，且值必须是100
     *      如果值不是100，则报错：
     *      Parameter conditions "bookId = 100" not met for actual request parameters: bookId={1010}
     *      本文中 要求bookId=100，而前端中传入的值为1010，报错：HTTP Status 400 – Bad Request
     *    2.params = "bookId != 100"：表示必须给一个bookId的参数，且值必须不是100
     *      报错： Parameter conditions "bookId!=100" not met for actual request parameters: bookId={100}
     *    3.{"param1=value1", "param2"}: 请求必须包含名为 param1 和 param2 的两个请求参数，
     *      且 param1 参数的值必须为 value1
     *      例如：params={"param1=bookId!=100", "param2"}
     *  注意：前端代码
     */
    @RequestMapping(value = "/find",method = RequestMethod.GET,params = "bookId")
    public String search(String bookId){
        System.out.println("bookId = " + bookId);
        return "success";
    }

    /***
     *  @RequestMapping 支持 Ant 风格资源地址
     *  用于前端请求方法/资源
     *  基本内容：(空格是因为要出现文档结束标志)
     *    1. ?：匹配文件名中的一个字符
     *      /user/* /createUser: 匹配 /user/aaa/createUser、/user/bbb/createUser 等 URL
     *    2. *：匹配文件名中的任意字符
     *      /user/** /createUser: 匹配 /user/createUser、/user/aaa/bbb/createUser 等 URL
     *    3. **:匹配多层路径
     *      /user/createUser??: 匹配 /user/createUseraa、/user/createUserbb 等 URL
     */
    //要求可以配置 /user/message/aa, /user/message/aa/bb/cc
    @RequestMapping(value = "/message/**")
    public String im() {
        System.out.println("发送消息");
        return "success";
    }

    /***
     *    @RequestMapping 配合 @PathVariable 映射 URL 绑定的占位符
     *    基本说明：
     *      1.我们希望目标方法获取到username和userId的值
     *        前端代码：<a href="user/reg/kristina/300">占位符的演示</a>
     *      2.解读：
     *        2.1 kristina是{username}
     *        2.2 300是{userId}
     *        2.3 @PathVariable("username")String name  将username的值赋给name
     *        注意：2.1、2.2的{}中的值可以有程序员决定，但@PathVariable中的值必须和value中的值对应
     *      3.补充：
     *
     */
    @RequestMapping(value="/reg/{username}/{userId}")
    public String register(@PathVariable("username")String name,@PathVariable("userId")String userId){
        System.out.println("name = " + name);
        System.out.println("userId = " + userId);
        return "success";
    }
    /***
     *  内容：
     *    如果我们确定表单或者超链接会提交某个字段数据比如(email),
     *    要求提交的参数名和目标方法的参数名保持一致
     *    如果不一致，则接收不到数据，但不会抛出异常，接收的值为null
     *  实例：
     *    ip         port    path    参数
     *    localhost:9998/user/hello3?email=tom@sohu.com
     *  解读：
     *    我们的请求参数中有email=xx,那么就会将传递的值赋给参数String email
     */
    @RequestMapping(value = "/hello3")
    public String hello(String email){
        System.out.println("email = " + email);
        return "success";
    }


}
